package futu

import (
	"sync"
	"time"
)

// 定义一个缓存项的结构体，包含数据和过期时间
type CacheItem struct {
	data interface{}
	expire int64
}

// 定义一个缓存的结构体，包含一个map和一个锁
type Cache struct {
	items map[string]*CacheItem
	mutex sync.RWMutex
}

// 创建一个新的缓存
func NewCache() *Cache {
	return &Cache{
		items: make(map[string]*CacheItem),
	}
}

// 设置一个缓存项，给定键，值和过期秒数
func (c *Cache) Set(key string, value interface{}, seconds int) {
	// 加写锁
	c.mutex.Lock()
	defer c.mutex.Unlock()
	// 计算过期时间
	expire := time.Now().Unix() + int64(seconds)
	// 创建一个新的缓存项
	item := &CacheItem{
		data: value,
		expire: expire,
	}
	// 存入map中
	c.items[key] = item
}

// 获取一个缓存项，给定键
func (c *Cache) Get(key string) interface{} {
	// 加读锁
	c.mutex.RLock()
	defer c.mutex.RUnlock()
	// 从map中获取缓存项
	item, ok := c.items[key]
	if !ok {
		// 如果不存在，返回nil
		return nil
	}
	// 判断是否过期
	if time.Now().Unix() > item.expire {
		// 如果过期，返回nil
		return nil
	}
	// 如果未过期，返回数据
	return item.data
}

// 删除一个缓存项，给定键
func (c *Cache) Delete(key string) {
	// 加写锁
	c.mutex.Lock()
	defer c.mutex.Unlock()
	// 从map中删除缓存项
	delete(c.items, key)
}

// 清空所有缓存项
func (c *Cache) Clear() {
	// 加写锁
	c.mutex.Lock()
	defer c.mutex.Unlock()
	// 清空map
	c.items = make(map[string]*CacheItem)
}
